<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>DefineProperty</title>
</head>
<body>
    <div id="app">
        hello
    </div>
    <script>
        // 模拟 vue 中的 data 选项
        let data = {
            message: 'hello'
        }

        // 模拟 Vue 实例
        let vm = {}

        // 数据劫持：当访问或设置 vn 中的成员时， 进行干预操作
        Object.defineProperty(vm, 'message', {
            // 可枚举（可遍历）
            enumerable: true,
            // 可配置（可以使用 delete 删除， 可以通过 defineProperty 重新定义）
            configurable: true,
            // 当获取值的时候执行
            get(){
                console.log('get:', data.message)
                return data.message
            },
            // 设置值的时候改变
            set(newValue){
                console.log('set:', newValue)
                if(newValue === data.message) return
                data.message = newValue,
                document.querySelector('#app').textContent = data.message
            }
            
        })

        // 测试
        vm.message = 'Husky'
        console.log(vm.message)

    </script>
</body>
</html>